#include <bits/stdc++.h>

using namespace std;

// ======================= 你的代码风格模板 =======================
const int N = 1e5 + 10;
const long long INF = 4e18; // 定义一个足够大的值作为负无穷，比原代码的1e9更安全

// 全局变量
int X, Y, Z, n;
long long a[N], b[N], c[N];
int vis[N]; // 标记每个人提供哪种硬币: 1=金, 2=银, 3=铜
long long ans = 0;

// 定义6个优先队列(大根堆)来寻找每种交换的最大收益
// pair<收益, 人的编号>
priority_queue<pair<long long, int>> q1, q2, q3, q4, q5, q6;

// 辅助函数：将一个人的所有潜在“交换收益”放入对应的优先队列
void add_person(int p_idx) {
    q1.push({b[p_idx] - a[p_idx], p_idx}); // 金 -> 银 (x->y)
    q2.push({c[p_idx] - b[p_idx], p_idx}); // 银 -> 铜 (y->z)
    q3.push({a[p_idx] - c[p_idx], p_idx}); // 铜 -> 金 (z->x)
    
    q4.push({c[p_idx] - a[p_idx], p_idx}); // 金 -> 铜 (x->z)
    q5.push({b[p_idx] - c[p_idx], p_idx}); // 铜 -> 银 (z->y)
    q6.push({a[p_idx] - b[p_idx], p_idx}); // 银 -> 金 (y->x)
}

int main() 
{
    #ifdef LOCAL
        freopen("data.in", "r", stdin);
        freopen("data.out", "w", stdout);
        auto start_time = chrono::high_resolution_clock::now();
    #endif

    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    // ================ 你的代码从这里开始 ================
    
    cin >> X >> Y >> Z;
    n = X + Y + Z;

    for (int i = 1; i <= n; ++i) {
        cin >> a[i] >> b[i] >> c[i];
    }

    // 1. 初始分配方案: 简单地按顺序分配
    for (int i = 1; i <= X; ++i) {
        vis[i] = 1; // 标记为提供金币
        ans += a[i];
    }
    for (int i = X + 1; i <= X + Y; ++i) {
        vis[i] = 2; // 标记为提供银币
        ans += b[i];
    }
    for (int i = X + Y + 1; i <= n; ++i) {
        vis[i] = 3; // 标记为提供铜币
        ans += c[i];
    }

    // 将所有人的潜在交换收益都加入优先队列
    for (int i = 1; i <= n; ++i) {
        add_person(i);
    }

    // 2. 反悔循环: 不断寻找最优交换来增加总收益
    while (true) {
        // 在每次循环开始时，清理掉队列中无效的旧信息（懒惰删除）
        // 例如，q1是金->银的队列，如果队首的人已经不是金币哥了，就弹出
        while (!q1.empty() && vis[q1.top().second] != 1) q1.pop();
        while (!q2.empty() && vis[q2.top().second] != 2) q2.pop();
        while (!q3.empty() && vis[q3.top().second] != 3) q3.pop();
        while (!q4.empty() && vis[q4.top().second] != 1) q4.pop();
        while (!q5.empty() && vis[q5.top().second] != 3) q5.pop();
        while (!q6.empty() && vis[q6.top().second] != 2) q6.pop();

        // 寻找当前所有可能的交换中，收益最大的一个
        long long max_gain = 0;
        int best_move_type = 0;

        // 检查5种交换情况
        // 情况1: x->y, y->z, z->x
        if (!q1.empty() && !q2.empty() && !q3.empty()) {
            long long current_gain = q1.top().first + q2.top().first + q3.top().first;
            if (current_gain > max_gain) {
                max_gain = current_gain;
                best_move_type = 1;
            }
        }
        // 情况2: x->z, z->y, y->x
        if (!q4.empty() && !q5.empty() && !q6.empty()) {
            long long current_gain = q4.top().first + q5.top().first + q6.top().first;
            if (current_gain > max_gain) {
                max_gain = current_gain;
                best_move_type = 2;
            }
        }
        // 情况3: x->y, y->x
        if (!q1.empty() && !q6.empty()) {
            long long current_gain = q1.top().first + q6.top().first;
            if (current_gain > max_gain) {
                max_gain = current_gain;
                best_move_type = 3;
            }
        }
        // 情况4: y->z, z->y
        if (!q2.empty() && !q5.empty()) {
            long long current_gain = q2.top().first + q5.top().first;
            if (current_gain > max_gain) {
                max_gain = current_gain;
                best_move_type = 4;
            }
        }
        // 情况5: z->x, x->z
        if (!q3.empty() && !q4.empty()) {
            long long current_gain = q3.top().first + q4.top().first;
            if (current_gain > max_gain) {
                max_gain = current_gain;
                best_move_type = 5;
            }
        }

        // 如果找不到任何能带来正收益的交换，说明已经达到最优解
        if (max_gain <= 0) {
            break;
        }

        // 3. 执行最优交换
        ans += max_gain;

        if (best_move_type == 1) {
            int p_x = q1.top().second; int p_y = q2.top().second; int p_z = q3.top().second;
            q1.pop(); q2.pop(); q3.pop();
            vis[p_x] = 2; vis[p_y] = 3; vis[p_z] = 1;
            add_person(p_x); add_person(p_y); add_person(p_z);
        } else if (best_move_type == 2) {
            int p_x = q4.top().second; int p_z = q5.top().second; int p_y = q6.top().second;
            q4.pop(); q5.pop(); q6.pop();
            vis[p_x] = 3; vis[p_z] = 2; vis[p_y] = 1;
            add_person(p_x); add_person(p_y); add_person(p_z);
        } else if (best_move_type == 3) {
            int p_x = q1.top().second; int p_y = q6.top().second;
            q1.pop(); q6.pop();
            vis[p_x] = 2; vis[p_y] = 1;
            add_person(p_x); add_person(p_y);
        } else if (best_move_type == 4) {
            int p_y = q2.top().second; int p_z = q5.top().second;
            q2.pop(); q5.pop();
            vis[p_y] = 3; vis[p_z] = 2;
            add_person(p_y); add_person(p_z);
        } else if (best_move_type == 5) {
            int p_z = q3.top().second; int p_x = q4.top().second;
            q3.pop(); q4.pop();
            vis[p_z] = 1; vis[p_x] = 3;
            add_person(p_z); add_person(p_x);
        }
    }

    cout << ans << endl;

    // ================ 你的代码到这里结束 ================
    
    #ifdef LOCAL
        auto end_time = chrono::high_resolution_clock::now();
        auto duration = chrono::duration_cast<chrono::milliseconds>(end_time - start_time);
        cerr << "Time cost: " << duration.count() << " ms" << endl;
    #endif
    
    return 0;
}